package com.ycxh.module.mybatis.batch;

import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

/**
 * 通用分批操作 处理批量sql超长
 */
public class BatchUtil {

    private final static int BATCH_NUM = 10; // 每一批处理多少个

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        for (int i = 0; i < 25; i++) {
            list.add("2");
        }

        System.out.println("----一个参数---");
        batchHandle(list, t1 -> t1.size());

        System.out.println("----多个参数---");
        // 只有list是可变的，其他参数一般都不会改变，所以归根结底，本质上也是一个参数
        batchHandle(list, t1 -> t1.size() + 1 + 2 + "1111".length());

    }

    /**
     * 分批处理 可能超过sql长度限制
     *
     * @param list 要求要分批的集合必须放第一个
     * @param function 将方法当成参数传递
     * @param <T>
     */
    public static <T> void batchHandle(List<T> list, Function<List<T>, Integer> function) {
        if (CollectionUtils.isEmpty(list) || function == null) {
            return;
        }
        int sum = list.size();
        // 每批多少条
        int count = BATCH_NUM;
        if (sum > count) {
            int limit = getSize(sum, count);
            for (int i = 0; i < limit; i++) {
                List subList = list.subList(i * count, i == (limit - 1) ? sum : (i + 1) * count);
                Integer apply = function.apply(subList);
                System.out.println("apply: " + apply);
            }
        } else {
            Integer apply = function.apply(list);
            System.out.println("apply: " + apply);
        }
    }

    /**
     * 方法描述：根据数据总数获取需要循环次数
     *
     * @param count 数据总数
     * @return loop 每次数量
     */
    public static int getSize(long count, int loop) {
        if (loop < 1) {
            return 0;
        }
        int size = 1;
        if (count > loop) {
            if (count % loop == 0) {
                size = (int) count / loop;
            } else {
                size = (int) count / loop + 1;
            }
        }
        return size;
    }

}
